提到以太坊錢,一定得先講講整個區塊鏈技術的開山始祖「比特幣(Bitcoin)」。中本聰在 2008 年提出比特幣白皮書,隨後在 2009 年正式誕生。起初,比特幣的概念是想要打造一種「去中心化的數位貨幣」。
貨幣的重要性質是作為一種交易媒介、價值儲存媒介,並且能夠被大眾信任。如下圖所示,比特幣的交易(Transaction)可以被看成是狀態轉移,這邊的狀態指得是 UTXO(Unspent Transaction Output)的集合。
透過這種 UTXO 的狀態轉移,透過將狀態如實記錄在某個中心化伺服器或硬碟中,其實就足以構建一個中心化的數位貨幣。
然而,比特幣還想滿足去中心化這個條件,因此需要將狀態轉移儲存在分散式網路中的每個節點當中。那麼,該如何確保每個節點對於整個網路的狀態有一致的認知呢?在比特幣中,以共識演算法 PoW(Proof of Work)確保分散式網路中一致的全局狀態。
儘管比特幣作為數位貨幣十分成功,能夠滿足價值交換、作為交易媒介等需求。然而,隨著整個社群對於去中心化應用程式(dApps)的需求提升,比特幣逐漸不敷使用。當然,比特幣也還有其他問題,如昂貴手續費、容量不足等問題,但此系列文暫不討論。當時,社群主流有三種解決辦法:
後來,Vitalik Buerin 在 2014 年提出以太坊白皮書,也就開啟了後續以太坊的蓬勃發展,以及 DeFi、DApp 的大放異彩。
以太坊起初想解決比特幣對於去中心化應用程式支援不足的問題。透過建構一個新的區塊鏈網路,Vitalik 當初建構以太坊時,便將其設計為一個更具備通用性、能執行圖靈完備程式碼的區塊鏈網路。由此,各種 DApp 與 DeFi 應用項目都能以程式碼的形式執行在以太坊上。
前面我們提到,數位貨幣以狀態轉移記錄交易。其中,比特幣透過 UTXO 的集合表示狀態。那麼,以太坊呢?
以太坊的狀態透過帳戶(Account)表示,帳戶可以分為外部帳戶(Externally Owned Account, EOA)以及合約帳戶(Contract Account, CA)。
其中,帳戶本身由以下部分組成:
外部帳戶由私鑰(private key)控制,能夠建立、簽署交易(Transaction),並且發送訊息。
合約帳戶則由智能合約的程式碼控制,收到訊息後,會執行對應的程式碼,能夠讀取、寫入帳戶的儲存空間(Storage),或者是發送訊息、建立新合約。
上一小節提到帳戶能夠建立、簽署交易(Transaction),而交易中會包含已簽署的資料與訊息。
一個典型的以太坊交易會包含:
因此,一筆交易的手續費(Gas Fee)則為:GAS FEE = STARTGAS * GASPRICE
。
合約帳戶中會包含程式碼,那麼,這些程式碼是被如何執行的呢?
以太坊的合約程式碼主要以基於 Stack 的低階組合語言編寫而成,又被稱做 EVM 程式碼,由 EVM 負責執行。大家普遍熟知的合約程式語言 Solidity 是編寫合約的高階語言,會先被編譯為前述的低階組合語言,才能被 EVM 執行。
合約程式碼能存取的資料主要有 1) Stack、2) Memory、3) Storage(也就是前述合約帳戶的儲存空間)。
關於 EVM 跟智能合約程式碼的編寫又能寫好幾篇文章,這邊就此打住。
前面幾個小節中,我們知道了以太坊中如何透過帳戶的方式定義狀態,也知道合約帳戶中的程式碼是如何被執行的。那麼,被送上以太坊網路的交易要如何驗證,以及在這樣分散式的網路架構中,各個節點要如何達成共識呢?
以太坊自 2022 年後,底層的共識機制就由 PoW(Proof of Work)轉為 PoS(Proof of Stake),因此本篇文章就先以介紹 PoS 為主。
PoS 的概念是網路中的各個節點如果要擔任驗證者(Validator),必須先 stake(質押)一筆以太幣以成為驗證者。每次 PoS 的共識演算法都會隨機、公平的挑選一個驗證者驗證交易。如此一來,避免了過去 PoW 所有節點都驗證、計算,但最後只有一個節點的 Work 被承認,其他人的運算就被浪費了。
當使用者或合約帳戶產生一筆交易時,該交易會被廣播到以太坊網路上,並且被放入各個節點的 mempool(Memory Pool)中。被挑選的驗證者會挑選一些交易,打包為一個區塊(Block),並且執行狀態轉移函式 APPLY(S,TX) = S'
。其中,合約程式碼也在這個狀態轉移的過程中被執行。
被挑選的驗證者執行完狀態轉移後,會將結果廣播到網路上,由其他的驗證者負責驗證結果正確無誤。如此,為一個完整的交易驗證流程。
由上,我們也能看出以太坊區塊鏈的區塊(Block)中主要包含了驗證者打包的交易(Transaction)清單。但除此之外,還包含了最新狀態的副本,而這也是以太坊與比特幣在區塊鏈架構上最大的差異。
比特幣網路狀態基於 UTXO(Unspent Transaction Output)的集合,如果要得知某個地址的餘額,需要從創世區塊(Genesis Block)一路推導至最新的區塊。
以太坊則不然,由於其狀態基於帳戶,每次狀態轉移後都會保留一份最新狀態的副本,因此能快速的取得餘額資訊。
本篇文章從區塊鏈的始祖比特幣講起,接著一路介紹以太坊的狀態定義、交易流程、驗證與共識機制。這方面的每一個概念與原理都能夠展開細講,寫成好幾篇文章,不過基於篇幅限制就只在本篇簡單描述。
本文主要參考以太坊白皮書寫成,原始文章寫得比這篇還詳細,非常推薦大家深入閱讀。
明天,我們將開始進入本次系列文的主題「以太坊的擴容之路」,從原理分析以太坊網路在容量上遇到的問題與限制。
[1] 以太坊白皮書, 2025